package vista;

import java.awt.Color;
import java.awt.Font;
import java.nio.FloatBuffer;

/*
 * lo que está en int son coordenadas pantalla
 * lo que está en float son coordenads de OpenGL
 */
public class Tema {
	
	private static Tema instancia = new Tema();
	
	private FloatBuffer ENTIDAD_COSA_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_COSA_COLOR_INFERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_PROGRAMADA_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_PROGRAMADA_COLOR_INFERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_HISTORICA_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_HISTORICA_COLOR_INFERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_DOMINIO_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ENTIDAD_DOMINIO_COLOR_INFERIOR = FloatBuffer.allocate(3);

	private FloatBuffer RELACION_ASOCICION_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer RELACION_ASOCICION_COLOR_MEDIO = FloatBuffer.allocate(3);
	private FloatBuffer RELACION_ASOCICION_COLOR_INFERIOR = FloatBuffer.allocate(3);
	private FloatBuffer RELACION_COMPOSICION_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer RELACION_COMPOSICION_COLOR_MEDIO = FloatBuffer.allocate(3);
	private FloatBuffer RELACION_COMPOSICION_COLOR_INFERIOR = FloatBuffer.allocate(3);
	
	private FloatBuffer JERARQUIA_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer JERARQUIA_COLOR_INFERIOR = FloatBuffer.allocate(3);
	
	private FloatBuffer ATRIBUTO_COMPUESTO_COLOR_SUPERIOR = FloatBuffer.allocate(3);
	private FloatBuffer ATRIBUTO_COMPUESTO_COLOR_INFERIOR = FloatBuffer.allocate(3);
	
	private FloatBuffer ATRIBUTO_COLOR = FloatBuffer.allocate(3);
	private FloatBuffer LINEA_COLOR = FloatBuffer.allocate(3);
	
	private int ENTIDAD_ALTURA_MITAD = 10;
	private int ENTIDAD_ANCHO_MITAD = 35;
	
	private int RELACION_ALTURA_MITAD = 14;
	private int RELACION_ANCHO_MITAD = 35;
	
	private final String FORMATO = "SansSerif";
	private final int LETRA_TAMANO = 9;
	private final Color LETRA_COLOR = new Color(0.0f, 0.1f, 0.1f);
	
	private final Color FONDO_COLOR = new Color(0.48f, 0.48f, 0.48f);
	
	private final FloatBuffer HOJA_COLOR = FloatBuffer.allocate(3);
    private final int HOJA_TAM_ALTO = 297;
    private final int HOJA_TAM_ANCHO = 210;
    
    // para la selección
	private FloatBuffer SELECCION_COLOR = FloatBuffer.allocate(3);

    public static Tema getInstancia(){
    	return instancia;
    }
    
	private Tema()
	{
		this.setEntidadCosaColorSuperior(1.00f, 0.84f, 0.84f);
		this.setEntidadCosaColorInferior(0.93f, 0.45f, 0.45f);
		
		this.setEntidadHistoricaColorSuperior(0.93f, 0.92f, 0.43f);
		this.setEntidadHistoricaColorInferior(0.82f, 0.82f, 0.23f);
		
		this.setEntidadDominioColorSuperior(0.71f, 0.83f, 0.99f);
		this.setEntidadDominioColorInferior(0.49f, 0.64f, 0.85f);
		
		this.setEntidadProgramadaColorSuperior(0.62f, 0.88f, 0.62f);
		this.setEntidadProgramadaColorInferior(0.35f, 0.55f, 0.35f);
		
		this.setRelacionAsociacionColorSuperior(0.93f, 0.84f, 0.99f);
		this.setRelacionAsociacionColorMedio(0.86f, 0.69f, 0.98f);
		this.setRelacionAsociacionColorInferior(0.72f, 0.42f, 0.93f);

		this.setRelacionComposicionColorSuperior(0.75f, 0.96f, 0.75f);
		this.setRelacionComposicionColorMedio(0.55f, 0.84f, 0.55f);
		this.setRelacionComposicionColorInferior(0.43f, 0.93f, 0.42f);
		
		this.setJerarquiaColorSuperior(1.0f, 1.0f, 0.7f);
		this.setJerarquiaColorInferior(1.0f, 1.0f, 0.3f);
		
		this.setAtributoCompuestoColorSuperior(0.61f,0.73f,0.85f);
		this.setAtributoCompuestoColorInferior(0.34f, 0.52f, 0.69f);
		
		this.setAtributoColor(0.61f,0.73f,0.85f);
		this.setLineaColor(0.0f, 0.0f, 0.0f);
		
		this.setHojaColor(0.99f, 0.99f, 0.99f);
		this.setSeleccionColor(0.35f, 0.35f, 0.35f);
	}

	public FloatBuffer getEntidadProgramadaColorSuperior() {
		return ENTIDAD_PROGRAMADA_COLOR_SUPERIOR;
	}

	public void setEntidadProgramadaColorSuperior(float rojo, float verde, float azul){
		this.setColor(ENTIDAD_PROGRAMADA_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getEntidadProgramadaColorInferior() {
		return ENTIDAD_PROGRAMADA_COLOR_INFERIOR;
	}

	public void setEntidadProgramadaColorInferior(float rojo, float verde, float azul) {
		this.setColor(ENTIDAD_PROGRAMADA_COLOR_INFERIOR, rojo, verde, azul);
	}
    
	public FloatBuffer getEntidadHistoricaColorSuperior() {
		return ENTIDAD_HISTORICA_COLOR_SUPERIOR;
	}

	public void setEntidadHistoricaColorSuperior(float rojo, float verde, float azul){
		this.setColor(ENTIDAD_HISTORICA_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getEntidadHistoricaColorInferior() {
		return ENTIDAD_HISTORICA_COLOR_INFERIOR;
	}

	public void setEntidadHistoricaColorInferior(float rojo, float verde, float azul) {
		this.setColor(ENTIDAD_HISTORICA_COLOR_INFERIOR, rojo, verde, azul);
	}
	
	public FloatBuffer getEntidadDominioColorSuperior() {
		return ENTIDAD_DOMINIO_COLOR_SUPERIOR;
	}

	public void setEntidadDominioColorSuperior(float rojo, float verde, float azul){
		this.setColor(ENTIDAD_DOMINIO_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getEntidadDominioColorInferior() {
		return ENTIDAD_DOMINIO_COLOR_INFERIOR;
	}

	public void setEntidadDominioColorInferior(float rojo, float verde, float azul) {
		this.setColor(ENTIDAD_DOMINIO_COLOR_INFERIOR, rojo, verde, azul);
	}
	
	public FloatBuffer getEntidadCosaColorSuperior() {
		return ENTIDAD_COSA_COLOR_SUPERIOR;
	}

	public void setEntidadCosaColorSuperior(float rojo, float verde, float azul){
		this.setColor(ENTIDAD_COSA_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getEntidadCosaColorInferior() {
		return ENTIDAD_COSA_COLOR_INFERIOR;
	}

	public void setEntidadCosaColorInferior(float rojo, float verde, float azul) {
		this.setColor(ENTIDAD_COSA_COLOR_INFERIOR, rojo, verde, azul);
	}
	
	public FloatBuffer getAtributoColor() {
		return ATRIBUTO_COLOR;
	}

	public void setAtributoColor(float rojo, float verde, float azul) {
		this.setColor(ATRIBUTO_COLOR, rojo, verde, azul);
	}
	
	public FloatBuffer getRelacionAsociacionColorSuperior() {
		return RELACION_ASOCICION_COLOR_SUPERIOR;
	}

	public void setRelacionAsociacionColorSuperior(float rojo, float verde, float azul){
		this.setColor(RELACION_ASOCICION_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getRelacionAsociacionColorMedio() {
		return RELACION_ASOCICION_COLOR_MEDIO;
	}

	public void setRelacionAsociacionColorMedio(float rojo, float verde, float azul){
		this.setColor(RELACION_ASOCICION_COLOR_MEDIO, rojo, verde, azul);
	}
	
	public FloatBuffer getRelacionAsociacionColorInferior() {
		return RELACION_ASOCICION_COLOR_INFERIOR;
	}

	public void setRelacionAsociacionColorInferior(float rojo, float verde, float azul){
		this.setColor(RELACION_ASOCICION_COLOR_INFERIOR, rojo, verde, azul);
	}
	
	public FloatBuffer getRelacionComposicionColorSuperior() {
		return RELACION_COMPOSICION_COLOR_SUPERIOR;
	}

	public void setRelacionComposicionColorSuperior(float rojo, float verde, float azul){
		this.setColor(RELACION_COMPOSICION_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getRelacionComposicionColorMedio() {
		return RELACION_COMPOSICION_COLOR_MEDIO;
	}

	public void setRelacionComposicionColorMedio(float rojo, float verde, float azul){
		this.setColor(RELACION_COMPOSICION_COLOR_MEDIO, rojo, verde, azul);
	}
	
	public FloatBuffer getRelacionComposicionColorInferior() {
		return RELACION_COMPOSICION_COLOR_INFERIOR;
	}

	public void setRelacionComposicionColorInferior(float rojo, float verde, float azul){
		this.setColor(RELACION_COMPOSICION_COLOR_INFERIOR, rojo, verde, azul);
	}
	
	public FloatBuffer getLineaColor() {
		return LINEA_COLOR;
	}

	public void setLineaColor(float rojo, float verde, float azul) {
		this.setColor(LINEA_COLOR, rojo, verde, azul);
	}

	public String getFuenteNombre(){
		return this.FORMATO;
	}
	
	public int getFuenteTamano(){
		return this.LETRA_TAMANO;
	}
	
	public Color getFuenteColor(){
		return this.LETRA_COLOR;
	}
	
	public int getEntidadAnchoMitad(){
		return ENTIDAD_ANCHO_MITAD;
	}
	
	public int getEntidadAltoMitad(){
		return ENTIDAD_ALTURA_MITAD;
	}
	
	public int getRelacionAnchoMitad(){
		return RELACION_ANCHO_MITAD;
	}
	
	public int getRelacionAltoMitad(){
		return RELACION_ALTURA_MITAD;
	}
	
	public Color getFondoColor(){
		return FONDO_COLOR;
	}
	
	public int getHojaAncho() {
		return HOJA_TAM_ANCHO;
	}
	
	public int getHojaAlto() {
		return HOJA_TAM_ALTO;
	}
	
	private void setColor(FloatBuffer buffer, float rojo, float verde, float azul)
	{
		buffer.put(0, rojo);
		buffer.put(1, verde);
		buffer.put(2, azul);
	}

	public FloatBuffer getHojaColor() {
		return HOJA_COLOR;
	}
	
	public void setHojaColor(float rojo, float verde, float azul){
		this.setColor(HOJA_COLOR, rojo, verde, azul);
	}

	public FloatBuffer getSeleccionColor() {
		return SELECCION_COLOR;
	}

	public void setSeleccionColor(float rojo, float verde, float azul) {
		this.setColor(SELECCION_COLOR, rojo, verde, azul);
	}
	
	public Font getFuenteGral(int tamano) {
		return new Font(Tema.getInstancia().getFuenteNombre(), Font.PLAIN, tamano);
	}

	private void setJerarquiaColorSuperior(float rojo, float verde, float azul) {
		this.setColor(JERARQUIA_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getJerarquiaColorSuperior() {
		return JERARQUIA_COLOR_SUPERIOR;
	}

	private void setJerarquiaColorInferior(float rojo, float verde, float azul) {
		this.setColor(JERARQUIA_COLOR_INFERIOR , rojo, verde, azul);
	}
	
	public FloatBuffer getJerarquiaColorInferior() {
		return JERARQUIA_COLOR_INFERIOR;
	}

	public FloatBuffer getAtributoCompuestoColorSuperior() {
		return ATRIBUTO_COMPUESTO_COLOR_SUPERIOR;
	}

	public void setAtributoCompuestoColorSuperior(float rojo, float verde, float azul) {
		this.setColor(ATRIBUTO_COMPUESTO_COLOR_SUPERIOR, rojo, verde, azul);
	}

	public FloatBuffer getAtributoCompuestoColorInferior() {
		return ATRIBUTO_COMPUESTO_COLOR_INFERIOR;
	}

	public void setAtributoCompuestoColorInferior(float rojo, float verde, float azul){
		this.setColor(ATRIBUTO_COMPUESTO_COLOR_INFERIOR, rojo, verde, azul);
	}
}
